package main

import (
	"fmt"
)

// 切片（动态数组）

// 切片传参与普通数组传参不同，切片传参是引用传递，可以对原数组修改
// 普通数组传参无法修改原数组
// 普通数组传参需要严格匹配数组类型的（要带上数组长度）
// func myArrayPrint(myArray []int) {
// 	for _, value := range myArray {
// 		fmt.Println("value = ", value)
// 	}

// 	myArray[1] = 999
// }

func main() {
	// myArray := []int{1, 2, 3, 4}
	// fmt.Printf("myArry type is %T\n", myArray)
	// myArrayPrint(myArray)

	// fmt.Println("##############")
	// for _, value := range myArray {
	// 	fmt.Println("value = ", value)
	// }

	// slice 声明方式
	// 方式1：声明并初始化  slice1长度为4，默认值为1，2，3，4
	// slice1 := []int{1, 2, 3, 4}

	// 方式2：只声明不初始化，并没有给slice2分配空间
	// var slice2 []int
	// 需要时可以使用make()函数来开辟空间
	// slice2 = make([]int, 3) // 开辟3个空间，默认值都为0

	// 方式3
	// var slice3 []int = make([]int, 3)

	// 方式4
	// slice4 := make([]int, 3)

	// 切片的追加
	numbers := make([]int, 3, 5)
	fmt.Printf("len = %d, cap = %d, numbers = %v\n", len(numbers), cap(numbers), numbers)
	// 向numbers末尾追加一个元素1
	numbers = append(numbers, 1)
	fmt.Printf("len = %d, cap = %d, numbers = %v\n", len(numbers), cap(numbers), numbers)

	numbers = append(numbers, 2)
	fmt.Printf("len = %d, cap = %d, numbers = %v\n", len(numbers), cap(numbers), numbers)

	// 当切片容量已满时，在追加元素，会自动将容量增加到原先的2倍
	numbers = append(numbers, 3)
	fmt.Printf("len = %d, cap = %d, numbers = %v\n", len(numbers), cap(numbers), numbers)

	// 切片截取
	// 截取区间左闭右开
	s1 := []int{1, 2, 3, 4}
	fmt.Println("s1 = ", s1)
	s2 := s1[0:2] // 取出s[0], s[1]
	fmt.Println("s2 = ", s2)

	// 修改s1和s2都会影响到对方
	// 所以截断是浅拷贝
	s1[0] = 5
	s2[1] = 6
	fmt.Println("s1 = ", s1)
	fmt.Println("s2 = ", s2)

	// copy函数，可以深拷贝
	s3 := make([]int, 3)
	copy(s3, s2)
	s2[0] = 7
	fmt.Println("s2 = ", s2) // [7 6]
	fmt.Println("s3 = ", s3) // [5 6 0]
}
